package com.bdqn.dao;

import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.*;

/**
 * <h3>项目名称:demo02222</h3>
 * <p>本API描述:操作数据库的基础类</p>
 * <p>@author : AliyZhang</p>
 * <p>@date : 2021-02-22 16:34</p>
 **/
public class BaseDao {
    //声明数据库连接对象
    private Connection connection;
    private PreparedStatement ps;
    private ResultSet rs;

    //通过普通的JDBC获取与数据库的连接
    private boolean getConnection(){
        String driver="com.mysql.jdbc.Driver";
        String url="jdbc:mysql://localhost:3306/news?characterEnconding=utf8";
        String user="root";
        String password="root";
        //加载MySQL的驱动jar包
        try {
            Class.forName(driver);
            connection= DriverManager.getConnection(url,user,password);
            return  true;
        }catch (Exception e){
            e.printStackTrace();
        }
        return false;
    }

    //通过数据源连接池获取与数据库的连接
    private boolean getConnectionByDs(){
        try{
            //获取容器
            InitialContext context = new InitialContext();
            //容器通过JNDI查找数据源
            DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/news");
            //通过数据源连接池获取连接对象
            connection = dataSource.getConnection();
            return true;
        }catch (Exception e){
            e.printStackTrace();
        }
        return  false;
    }

    //通用的增删改  先传入SQL字符串，有参的则传入参数并将对象放入参数数组中
    /*
        insert into stu(sname,spwd,gender,gid) values(?,?,?,?);
        在执行语句时需要为每一个参数占位符赋值
     */
    public int executeUpdate(String sql, Object[] params){
        //params表示传入的参数存入的数组
        int rows=0;
        if (getConnection()){
            try {
                //产生预编译语句对象
                ps=connection.prepareStatement(sql);
                //判断SQL语句中有无参数，若有参数，则为参数赋值
                if (params!=null && params.length>0){
                    for (int i=0;i<params.length;i++){
                        ps.setObject(i+1,params[i]);
                    }
                }
                //执行语句
                rows = ps.executeUpdate();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }

        }
        return rows;
    }


    //通用的查询
    public ResultSet executeQuery(String sql,Object[] params){
        if (getConnection()){
            try {
                //产生预编译语句对象
                ps=connection.prepareStatement(sql);
                //判断SQL语句中有无参数，若有参数，则为参数赋值
                if (params!=null && params.length>0){
                    for (int i=0;i<params.length;i++){
                        ps.setObject(i+1,params[i]);
                    }
                }
                //执行语句
                rs = ps.executeQuery();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

        return rs;
    }

    //关闭资源
    public void close(){
        try {
            if(rs!=null){
                rs.close();
            }
            if(ps!=null){
                ps.close();
            }
            if(connection!=null){
                connection.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }


}
